package com.xiaolin.base.string;

import java.io.UnsupportedEncodingException;

/**
 * @ClassName SubString01
 * @Description 截取字符串，包含中文和英文
 * @Detail 编写一个截取字符串的函数，输入为一个字符串和字节数，输出为按字节截取的字符串。但是要保证汉字不被截半个，
 *          例如“人abc”，应该截为“人ab”;输入“人abc们”，应该截为“人abc”,而不是截为“人ab+们的半个
 *              步骤：
 *                  1、无效判断
 *                  2、获取字节数组，需指定字符编码
 *                  3、循环遍历中文计数，单数则表示输入的字节数会截取到半个单词
 *                  4、判断中文计数奇偶数，奇数的要字节数减一
 * @Author MyPC
 * @Date 2020/7/23
 * @Version 1.0
 */
public class SubString01 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str="abc你好a1";
        String string = subString(str, 7);
        System.out.println(string);
    }
    public static String subString(String string,int byteCount) throws UnsupportedEncodingException {
        //1、判断无效输入，string.length()代表字符个数，而不是字节数
        if(string == null || string.length() < 1 || byteCount<1 ){
            return null;
        }
        //GBK编码的话，英文字符和数字占一个字节，中文字符占两个字节，utf-8的话，英文字符和数字占一个字节，中文字符占三个字节
        byte[] bytes = string.getBytes("gbk");
        //输入字节数大于字节数组长度时，直接返回结果即可
        if(byteCount >= bytes.length){
            return string;
        }
        //汉字计数，如果为单数，则说明截取的字符串是半个
        int wordCount=0;
        for(int i=0;i<byteCount;i++){
            //gbk中,汉字是两个负数表示
            int temp=bytes[i];
            if(temp<0){
                wordCount++;
            }
        }
        //第一种方式，创建一个新的字符串返回，需要指定字符编码
        if(wordCount %2==0){
            return new String(bytes,0,byteCount,"gbk");
        }else {
            //半个的话减去1
            return new String(bytes,0,--byteCount,"gbk");
        }
        //第二种方式，字节截取字符串
        //完整的汉字
//        if (wordCount % 2 == 0) {
//            return string.substring(0, (byteCount - (wordCount / 2)));
//        }
//        //半个汉字 所以  -1
//        return string.substring(0, (byteCount - (wordCount / 2) - 1));
    }
}
